# 函数的参数

"""
1、不定长参数
    在定义函数时，可以在形参前边加上一个*，这样这个形参将会获取到所有的实参。
2、定义一个函数，可以求任意个数字的和
    *nums会接受所有的位置实参，并且会将这些实参统一保存到一个元组中（装包）。
"""


def sum1(*nums):
    # 定义一个变量，来保存结果
    result = 0
    # 遍历元组，并将元组中的数进行累加
    for n in nums:
        result += n
    print(result)


"""
1、带星号的形参只能有一个，可以和其他参数配合使用。
"""


# 第一个参数给a，第二个参数给b，剩下的都保存到c的元组中
def fn1(a, b, *c):
    print('a =', a)
    print('b =', b)
    print('c =', c)


"""
输出结果如下：
a = 1
b = 2
c = (3, 4)
"""
fn1(1, 2, 3, 4)

"""
1、可变参数不是必须写在最后，但是注意，带*的参数后的所有参数
，必须以关键字参数的形式传递。
"""


# 第一个参数给a，剩下的位置参数给b的元组，c必须使用关键字参数。
def fn2(a, *b, c):
    print('a =', a)
    print('b =', b)
    print('c =', c)


"""
输出结果如下：
a = 1
b = (2, 3)
c = 4
"""
fn2(1, 2, 3, c=4)

"""
1、**形参可以接收其他的关键字参数，它会将这些参数统一保存到一个字典中。
2、**形参只能有一个，并且必须写在所有参数的最后。
3、字典的key就是参数的名字，字典的value就是参数的值。
"""


def fn3(b, c, **a):
    print('a =', a, type(a))
    print('b =', b)
    print('c =', c)


"""
输出结果如下：
a = {'d': 2, 'e': 10, 'f': 20} <class 'dict'>
b = 1
c = 3
"""
fn3(b=1, d=2, c=3, e=10, f=20)

"""
1、参数的解包
    传递实参时，也可以在序列类型的参数前添加星号，
    这样他会自动将序列中的元素依次作为参数传递。
    这里要求序列中元素的个数必须和形参的个数的一致。
"""


def fn4(a, b, c):
    print('a =', a)
    print('b =', b)
    print('c =', c)


# 创建一个元组
t = (10, 20, 30)
"""
输出结果：
a = 10
b = 20
c = 30
"""

fn4(*t)

# 创建一个字典
d = {'a': 100, 'b': 200, 'c': 300}
"""
1、通过 **来对一个字典进行解包操作
2、结果如下：
a = 100
b = 200
c = 300
"""

fn4(**d)
